import { ReactNode, InputHTMLAttributes, HTMLAttributes } from 'react';
import { CSSObject } from 'styled-components';
import { ISelectTextfieldTextareaProps } from '../common/SelectTextfieldTextareaTypes';

/**
 * Тип состояния поля ввода.
 * @typedef {'error' | 'success'} Status
 */
export type Status = 'error' | 'success';

/**
 * Тип поля ввода.
 * @typedef {'text' | 'email' | 'url' | 'tel' | 'number' | 'search' | 'password'} TextfieldType
 */
export type TextfieldType = 'text' | 'email' | 'url' | 'tel' | 'number' | 'search' | 'password';

/**
 * @typedef { Object } ITextfieldProps - Реквизиты для компонента Textfield.
 * @property { hint } - Подсказка поля ввода.
 * @property { status } - Статус поля ввода.
 * @property { type } - Тип поля ввода.
 * @property { inputStyle } - Пользовательский стиль для поля ввода.
 * @property { filledStyle } - Пользовательский стиль для заполненного поля ввода.
 * @property { className } - Пользовательский класс для поля ввода.
 * @property { clearClick } - Обработчик нажатия на кнопку очистки поля ввода.
 * @property { icon } - Иконка для поля ввода.
 * @property { clear } - Флаг, указывающий, должна ли быть отображена кнопка очистки.
 * @property { inputWidth } - Устанавливает пользовательскую ширину поля ввода.
 * @property { marginLeft } - Устанавливает отступ слева.
 * 
 */
export type TTextfieldProps = ISelectTextfieldTextareaProps & InputHTMLAttributes<HTMLInputElement> & {type?: TextfieldType} &
{
  hint?: string;
  status?: Status;
  type?: TextfieldType;
  inputStyle?: CSSObject;
  filledStyle?: CSSObject;
  className?: string;
  clearClick?: () => void;
  icon?: ReactNode;
  clear?: boolean;
  inputWidth?: string;
  marginLeft?: string;
};

/**
 * Реквизиты для стилизованного компонента StyledTextfield.
 * @typedef {InputHTMLAttributes<HTMLInputElement> & Omit<ISelectTextfieldTextareaProps, 'clearClick' | 'icon'>} IStyledTextfieldProps
 */
export type TStyledTextfieldProps = Omit<TTextfieldProps, 'clearClick' | 'icon' | 'className'>;

/**
 * Реквизиты для стилизованного компонента подсказки поля ввода.
 * @typedef {Pick<ISelectTextfieldTextareaProps, 'hint' | 'status'>} IStyledSpan
 */
export type TStyledSpan = Pick<TTextfieldProps, 'hint' | 'status'> & Pick<ISelectTextfieldTextareaProps, 'dimension'>;

export type TStyledTextfieldContainer = HTMLAttributes<HTMLDivElement> & Pick<ISelectTextfieldTextareaProps, 'dimension'>;



